package com.carbon.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.carbon.common.api.Paging;
import com.carbon.domain.common.ApiResult;
import com.carbon.system.entity.CarbonArticle;
import com.carbon.system.entity.MenuVO;
import com.carbon.system.entity.SysRole;
import com.carbon.system.entity.SysRoleMenu;
import com.carbon.system.param.SysRoleMenuAddParam;
import com.carbon.system.param.SysRoleQueryParam;
import com.carbon.system.vo.SysRoleQueryVo;
import com.carbon.system.common.BaseController;
import com.carbon.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;


/**
 * <p>
 * 角色  前端控制器
 * </p>
 *
 * @author Li Jun
 * @since 2021-06-18
 */
@Slf4j
@RestController
@RequestMapping("/sysRole")
@Api(value = "角色 模块", tags = {"角色 模块"})
public class SysRoleController extends BaseController {
    @Autowired
    private SysRoleService roleService;
    /**
     * 获取角色列表
     * @param page 页码，可从请求参数获取（示例，实际需完善分页参数接收）
     * @param size 每页条数，可从请求参数获取（示例，实际需完善分页参数接收）
     * @param keyword 搜索关键词，可从请求参数获取（示例）
     * @return 角色列表及分页信息等，用 Result 统一封装返回（假设自定义了 Result 类）
     */
    @GetMapping("/list")
    public ApiResult getRoleList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String keyword) {
        Page<SysRole> param = new Page<>(page, size);
        IPage<SysRole> paging = roleService.getRoleList(keyword,param);
        // 后续可通过 roleService 调用业务逻辑，这里先返回框架
         return ApiResult.ok(paging);
    }

    /**
     * 获取角色已有权限
     * @param roleId 角色ID
     * @return 角色已拥有的权限ID列表等，用 Result 统一封装返回
     */
    @GetMapping("/{roleId}/permissions")
    public ApiResult getRolePermissions(@PathVariable Long roleId) {
        // 后续可通过 roleService 调用业务逻辑，这里先返回框架
        List<MenuVO> menus = roleService.getRolePermissions(roleId);
         return ApiResult.ok(menus);
    }

    /**
     * 保存角色权限
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表（假设从请求体获取，需定义对应的接收实体或直接用 List）
     * @return 保存结果，用 Result 统一封装返回
     */
    @PostMapping("/{roleId}/permissions")
    public ApiResult saveRolePermissions(
            @PathVariable Long roleId,
            @RequestBody List<Long> permissionIds) {
        // 后续可通过 roleService 调用业务逻辑，这里先返回框架
        Boolean a = roleService.saveRolePermissions(roleId, permissionIds);
         return ApiResult.result(a);
    }

    /**
     * 删除角色
     * @param id 角色ID
     * @return 删除结果，用 Result 统一封装返回
     */
    @DeleteMapping("/{id}")
    public ApiResult deleteRole(@PathVariable Long id) {
        roleService.removeRoleMenu(id);
        boolean b = roleService.removeById(id);

        // 后续可通过 roleService 调用业务逻辑，这里先返回框架
         return ApiResult.result(b);
        //return null;
    }
    /**
     * 新增角色
     * @param role 角色信息（假设从请求体获取，需定义对应的接收实体）
     * @return 新增结果，用 Result 统一封装返回
     */
    @PostMapping("/add")
    public ApiResult addRole(@RequestBody SysRole role) {
        boolean b = roleService.saveRole(role);
        // 后续可通过 roleService 调用业务逻辑，这里先返回框架
        return ApiResult.result(b);
    }
}

